#ifndef __CCLIENTMGR_H__
#define __CCLIENTMGR_H__
/**
 * @file ClientMgr.h
 * @author Lost
 * @date 一月 2020
 * @brief 客户端管理类
 * 
 */
#include <vector>
#include <map>
#include <string>

#include "Singleton.h"
#include "packet.pb.h"

using std::vector;
using std::string;
using std::map;
using std::pair;

class CClientMgr;

/*!< cmd 处理函数模型 */
typedef int(CClientMgr::*CALLBACK_CMD_HANDLE)(const string &stCmd, vector<string> &vecParam);


/**
 * @brief cmd处理结构
 * @note
 */
struct CmdHandleLoader
{
    /*!< 控制台命令 */
    string stCmd;

    /*!< 描述 */
    string stDesc;

    /*!< 处理成员函数 */
    CALLBACK_CMD_HANDLE pfCmdHandle;

    /*!< 成员函数所在的类对象 */
    CClientMgr *pHandleClass;
};


/**
 * @brief 客户端处理类
 * @note 
 */
class CClientMgr:public CSingleton<CClientMgr>
{
public:
	CClientMgr();
	~CClientMgr();

public:
    /**
     * @brief 初始化
     * @note 
     */
	bool Init();

    /**
     * @brief 设置连接服务器的套接字
     * @note 
     */
	void SetSocket(int iSocket);

    /**
     * @brief 处理cmd总入口
     * @note 
     */
	int Handle(const string &sCmd, vector<string> &vecParam);

    /**
     * @brief 查看帮助
     * @note 
     */
    int HandleHelp(const string &sCmd, vector<string> &vecParam);

    /**
     * @brief 登录角色
     * @note 
     */
    int HandleLogin(const string &sCmd, vector<string> &vecParam);

    /**
     * @brief 登录角色回报
     * @note
     */
    static int HandleLoginRes(const string &pbLoginRes);

    /**
     * @brief 显示操作指令
     * @note
     */
    void ShowWelcomeToConsole();

    /**
     * @brief 检查控制台输入
     * @note 非阻塞函数,当按下回车的时候,才会返true
     */
    bool CheckInputFromConsole();

    /**
     * @brief 获取控制台输入内容
     * @note 获取后如果需要重新获取新的输入之前,必须调用ClearInputFromConsole()函数
     */
    const string &GetInputFromConsole();

    /**
     * @brief 清空控制台输入内容
     * @note 获取控制台输入内容后,需要重新获取新的输入之前,必须调用此函数.
     */
    void ClearInputFromConsole();


private:
    /*!< 控制台输入的字符串 */
    string m_stConsoleInputBuff;

    /*!< 连接服务器的套接字 */
	int m_iSocket;

    /*!< cmd 处理表 */
    typedef map<const string, CmdHandleLoader> HandleMap;
    HandleMap m_mapCmdHandles;
};



#endif